package site.lianwu.mybatis.plus.query.define;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import java.util.Arrays;
import java.util.Collection;

/**
 * 多值查询抽象类
 *
 * @author LianWu
 * @see ConditionType.In
 * @see ConditionType.NotIn
 */
public abstract class MultiValueCondition implements Condition {

    /**
     * 对多值查询条件的通用逻辑处理
     * @param wrapper 条件包装
     * @param column （数据表中的）列名
     * @param value 条件值
     * @throws IllegalArgumentException 如果条件值既不是{@code Collection}也不是{@code Array}类型
     */
    @Override
    public final void accept(QueryWrapper<?> wrapper, String column, Object value) {
        Collection<?> params;
        if (value instanceof Collection) {
            params = (Collection<?>) value;
        } else if (value.getClass().isArray()) {
            params = Arrays.asList((Object[]) value);
        } else {
            throw new IllegalArgumentException(String.format("%s列的条件值%s既不是Array也不是Collection类型", column, value));
        }
        accept(wrapper, column, params);
    }

    /**
     * 接受一个条件包装、列名和（多个）值，用于构建多值查询条件
     *
     * @param wrapper 条件包装
     * @param column （数据表中的）列名
     * @param values （多）条件值
     */
    protected abstract void accept(QueryWrapper<?> wrapper, String column, Collection<?> values);

}
